package com.sen.common.utils.time;

import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;

/**
 * 计算持续期间, 翻译成可读性更好的表达.
 * 
 * @author sen
 */
public final class DurationUtils {

	// 2天为上限, 1天前为昨天, 2天前为前天
	private static final int THE_DAY_BEFORE_YESTERDAY = 2;
	private static final int YESTERDAY = 1; // 2天为上限, 1天前为昨天, 2天前为前天
	private static final int MAX_HOURS_TOLERATE = 1; // 1小时前, 只显示分钟数
	private static final int MAX_MINUTES_TOLERATE = 1; // 1分钟前, 只显示"刚刚"

	private DurationUtils() {
		// empty!
	}

	/**
	 * 和当前的时间对比, 翻译成可读性更好的表达.
	 * 
	 * @param seconds
	 *            要对比的时间秒数.
	 * @return 可读性更好的表达.
	 */
	public static String seconds(Long seconds) {
		return seconds(SecondsUtils.seconds(), seconds);
	}

	/**
	 * 对比两个时间的间隔, 翻译成可读性更好的表达.
	 * 
	 * @param seconds1
	 *            时间基准的秒数.
	 * @param seconds2
	 *            要对比的时间秒数.
	 * @return 可读性更好的表达.
	 */
	public static String seconds(Long seconds1, Long seconds2) {
		return millis(SecondsUtils.millis(seconds1), SecondsUtils.millis(seconds2));
	}
	
	public static String millis(Long millis) {
		return millis(System.currentTimeMillis(), millis);
	}

	public static String millis(Long millis1, Long millis2) {
		long durationMillis = millis1.longValue() - millis2.longValue();
		
		int days = (int) (durationMillis / DateUtils.MILLIS_PER_DAY);
		if (days > THE_DAY_BEFORE_YESTERDAY) {
			return DateFormatUtils.format(millis2, "MM月dd日HH:mm");
		}
		if (days == THE_DAY_BEFORE_YESTERDAY) {
			return DateFormatUtils.format(millis2, "前天HH:mm");
		}
		if (days == YESTERDAY) {
			return DateFormatUtils.format(millis2, "昨天HH:mm");
		}
		
		int hours = (int) (durationMillis / DateUtils.MILLIS_PER_HOUR);
		if (days == 0 && hours >= MAX_HOURS_TOLERATE) {
			return DateFormatUtils.format(millis2, "今天HH:mm");
		}

		durationMillis = durationMillis - (hours * DateUtils.MILLIS_PER_HOUR);
		int minutes = (int) (durationMillis / DateUtils.MILLIS_PER_MINUTE);
		if (hours == 0 && minutes > MAX_MINUTES_TOLERATE) {
			return minutes + "分钟前";
		}
		return "刚刚";
	}
}
